Tailscale 是目前最优雅的零配置内网穿透方案之一,但在 阿里云 ECS 上使用时,许多开发者会遇到一个令人抓狂的问题:

安装成功,但阿里云内网服务全部失效:DNS 不通、yum 不能用、元数据服务无法访问。

这不是你的锅,而是 阿里云与 Tailscale 的网络设计天然冲突
本文将带你完整理解问题根源,并给出三套可稳定运行的解决方案。


🧨 一、为什么阿里云 ECS 会与 Tailscale 冲突? ​

阿里云内部服务使用的网段是:

服务IP
内网 DNS100.100.2.136 / 100.100.2.138
内网镜像源100.100.2.148
元数据服务100.100.100.200

而 Tailscale 默认虚拟网段是:

1
100.64.0.0/10

覆盖范围:

1
100.64.0.0100.127.255.255

你应该已经看出来了:

阿里云的 100.100.x.x 正好落在 Tailscale 的虚拟网段里 → 被 Tailscale 当成“虚拟网络流量”直接 DROP。

这导致:

  • 阿里云 DNS 不通
  • yum 镜像源无法访问
  • 元数据服务失效
  • curl 访问 100.100.x.x 全部失败

更糟的是,Tailscale 会修改 /etc/resolv.conf

1
nameserver 100.100.100.100

进一步覆盖了阿里云的 DNS 配置。


🧪 二、如何复现这个问题? ​

安装 Tailscale 后执行:

1
curl http://100.100.100.200/latest/meta-data/ (100.100.100.200 in Bing)

结果:

1
curl: (7) Failed to connect

再试 DNS:

1
dig @100.100.2.136 aliyun.com

结果:

1
connection timed out; no servers could be reached

这就是典型的 Tailscale 冲突。


🛠 三、三种稳定解决方案(按场景选择) ​

下面是三套经过大量实测的解决方案,你可以根据自己的需求选择。


🥇 方案 A:关闭 Tailscale 防火墙(最推荐) ​

适用场景:

  • 只需要点对点互联
  • 不需要 exit-node
  • 不需要子网路由
  • 想要最稳定、最省心的配置

命令:

1
2
3
sudo tailscale up \
--netfilter-mode=off \
--accept-dns=false

效果:

  • Tailscale 不再插入 DROP 规则
  • 阿里云内网服务全部恢复
  • Tailscale 正常使用
  • MagicDNS 不启用(可用自己的 DNS)

这是目前在阿里云 ECS 上最稳定的方式。


🥈 方案 B:使用 nodivert 模式(保留部分防火墙) ​

适用场景:

  • 想保留 Tailscale 的部分安全机制
  • 想继续使用 MagicDNS

命令:

1
2
3
sudo tailscale up \
--netfilter-mode=nodivert \
--accept-dns=true

特点:

  • 不会劫持主链路
  • 阿里云内网 DNS 不再被 DROP
  • MagicDNS 可用

⚠️ 注意:nodivert 模式存在 CVE-2019-14899 风险,但云环境影响较小。


🥉 方案 C:给阿里云内网服务加白名单(适合 exit-node) ​

适用场景:

  • 必须使用 exit-node
  • 或必须使用子网路由

1. 插入白名单规则 ​

1
2
3
4
sudo iptables -I ts-input 1 -s 100.100.2.136/32 -j ACCEPT
sudo iptables -I ts-input 1 -s 100.100.2.138/32 -j ACCEPT
sudo iptables -I ts-input 1 -s 100.100.2.148/32 -j ACCEPT
sudo iptables -I ts-input 1 -s 100.100.100.200/32 -j ACCEPT

2. 持久化规则(systemd) ​

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sudo bash -c 'cat > /etc/systemd/system/fix-ts.service <<EOF
[Unit]
Description=Fix Tailscale DNS conflict
After=tailscaled.service

[Service]
Type=oneshot
ExecStart=/usr/sbin/iptables -I ts-input 1 -s 100.100.2.136/32 -j ACCEPT
ExecStart=/usr/sbin/iptables -I ts-input 1 -s 100.100.2.138/32 -j ACCEPT
ExecStart=/usr/sbin/iptables -I ts-input 1 -s 100.100.2.148/32 -j ACCEPT
ExecStart=/usr/sbin/iptables -I ts-input 1 -s 100.100.100.200/32 -j ACCEPT

[Install]
WantedBy=multi-user.target
EOF'

🔍 四、如何验证冲突是否已解决? &#8203;

1. DNS 是否恢复 &#8203;

1
2
dig @100.100.2.136 example.com

2. yum 是否恢复 &#8203;

1
2
curl -I http://mirrors.cloud.aliyuncs.com (mirrors.cloud.aliyuncs.com in Bing)

3. 元数据服务是否恢复 &#8203;

1
2
curl http://100.100.100.200/latest/meta-data/ (100.100.100.200 in Bing)

如果这三个都正常 → 冲突已完全解决。


🎯 五、阿里云 ECS 最佳实践(总结) &#8203;

场景推荐方案
普通互联、最稳定方案 A:netfilter-mode=off
想保留 MagicDNS方案 B:nodivert
需要 exit-node 或子网路由方案 C:iptables 白名单

对于大多数阿里云 ECS 用户来说:

方案 A 是最干净、最稳定的选择。